package com.lw.single;

/**
 * @author LW
 * @2020/8/21 22:27
 */
//懒汉式单例
public class LazyMan {

    private LazyMan() {
        System.out.println(Thread.currentThread().getName()+"===>ok");
    }
    //这里的volatile解决new对象（因为不是原子性操作而导致的指令重排问题）
    private volatile static LazyMan lazyMan;
    //双层锁检测锁模式的  懒汉式单例   DCL
    public static LazyMan getInstance(){
        if (lazyMan==null){
            synchronized (LazyMan.class){//这里加锁   则解决了原子性问题
                if (lazyMan==null){
                    lazyMan = new LazyMan();//不是原子性操作
                    /**   new LazyMan()
                     * 1.分配内存空间
                     * 2.执行构造方法（初始化对象）
                     * 3.把对象指向这个空间
                     *123
                     * 132
                     * 三个步骤可能重排
                     * 导致其他线程可能不知道对象是否初始化完毕
                     */
                }
            }
        }
        return lazyMan;
    }
    //多线程并发
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                lazyMan.getInstance();
            }).start();
        }
    }
}
